home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / ldpcx04 / ldpcx04s.lzh / LDPCX.S < prev    next >
Text File  |  1997-07-23  |  54KB  |  2,389 lines

  1. *********************************************************************************
  2. *    PCX Loader                    <LDPCX.X Ver. 0.03>    *
  3. *********************************************************************************
  4.  
  5.     .include    doscall.mac
  6.     .include    iocscall.mac
  7.     .include    myconst.h
  8.  
  9.     .xref    _pcx4_prt
  10.     .xref    _pcx4_scroll
  11.     .xref    _pcx8_prt
  12.     .xref    _pcx8_scroll
  13.     .xref    _pcx24_prt
  14.     .xref    _pcx24_scroll
  15.     .xref    _Tone_down
  16.     .xref    _Tone_up
  17.  
  18.     .xref    _Wait
  19.  
  20.     .xdef    key_chk
  21.     .xdef    tenkey_chk
  22.     .xdef    cursor_chk
  23.     .xdef    mouse_chk
  24.     .xdef    x_set
  25.     .xdef    y_set
  26.     .xdef    v_wait
  27.     .xdef    inf_change
  28.  
  29.     .xdef    tate
  30.     .xdef    yoko
  31.     .xdef    x_max
  32.     .xdef    y_max
  33.     .xdef    x_pos
  34.     .xdef    y_pos
  35.     .xdef    crt_y
  36.     .xdef    gr_addr
  37.     .xdef    buff_addr
  38.     .xdef    fi_size
  39.     .xdef    kflg
  40.     .xdef    mflg
  41.     .xdef    esc_flg
  42.     .xdef    next_flg
  43.     .xdef    inkey_flg3
  44.     .xdef    scroll_key
  45.     .xdef    s_dot4
  46.     .xdef    s_dot8
  47.     .xdef    s_dot24
  48.  
  49. pcx_header:
  50. p_type:        equ    0        *ファイル識別子?
  51. p_bpp:        equ    3        *
  52. p_sx        equ    4        *開始x,y座標
  53. p_sy        equ    4        *
  54. p_ex:        equ    8        *終了x,y座標
  55. p_ey:        equ    10        *
  56. p_dummy2:    equ    12        *?
  57. p_pal:        equ    16        *パレットデータの先頭
  58. p_npl:        equ    65        *
  59. p_bpl:        equ    66        *
  60. p_image:    equ    128        *イメージデータの先頭
  61.  
  62. COL16        equ    $0A050101
  63. COL256        equ    $0A050108
  64.  
  65. S_DOT    equ    8
  66.     .text
  67.  
  68. start:
  69.     lea.l    mysp(pc),sp        *スタックセット
  70.  
  71.     move.l    a0,-(sp)        *a0とっておく
  72.  
  73.     lea.l    16(a0),a0        *余分なメモリ開放
  74.     suba.l    a0,a1
  75.     move.l    a1,-(sp)
  76.     move.l    a0,-(sp)
  77.     DOS    _SETBLOCK
  78.     addq.l    #8,sp
  79.  
  80.     move.l    (sp)+,a0        *a0戻す
  81.  
  82.     bsr    wait_path_set        *waitデータのパス設定
  83.     bsr    wait_read        *waitデータの読み込み
  84.     bsr    cmdchk            *コマンドラインの解析
  85.     bsr    buf_get            *バッファ確保
  86.     bsr    super            *スーパーモードへ
  87.     bsr    cursol_clr        *カーソル消す
  88.     bsr    name_get        *ファイル名を取得し処理する
  89.     bsr    user            *ユーザモードへ
  90.     bsr    buf_free        *バッファ開放
  91.     bsr    wait_write        *waitデータの書き込み
  92.     bsr    exit            *終了処理
  93.     DOS    _EXIT
  94.  
  95. *****************************************************************
  96. *    ファイル名を取得し、ファイルの読み込みを行う        *
  97. *****************************************************************
  98. name_get:
  99.     clr.w    file_cnt        *ファイル数のカウント初期化
  100.  
  101.     bsr    chkname            *ファイル名に対する前処理
  102.     bsr    chkext            *拡張子が省略されているかチェック
  103.  
  104.     move.w    #ARCHIVE,-(sp)        *最初のファイルを検索する
  105.     pea.l    arg(pc)            *
  106.     pea.l    filbuf(pc)        *
  107.     DOS    _FILES            *
  108.     lea.l    10(sp),sp        *
  109.  
  110. loop:
  111.     tst.l    d0            *ファイルは見つかったか?
  112.     bmi    done            * 見つからなければ処理完了
  113.  
  114.     bsr    setpath            *得られたファイル名を
  115.                     * フルパスに再構成する
  116.  
  117.     bsr    main            *メイン処理
  118.  
  119.     tst.b    esc_flg            *エスケープ?
  120.     bne    done
  121.  
  122.     pea.l    filbuf(pc)        *つぎのファイルを検索する
  123.     DOS    _NFILES            *
  124.     addq.l    #4,sp            *
  125.  
  126.     bra    loop            *繰り返す
  127.  
  128. done:
  129.     bsr    file_cnt_chk        *処理したファイル数のチェック
  130.     rts
  131.  
  132. *****************************************************************
  133. *    files実行に先立ってファイル名に前処理を加える        *
  134. *****************************************************************
  135. chkname:
  136.     pea.l    nambuf(pc)        *ファイル名を展開する
  137.     pea.l    arg(pc)            *
  138.     DOS    _NAMECK            *
  139.     addq.l    #8,sp            *
  140.  
  141.     tst.l    d0            *d0<0なら
  142.     bmi    name_er            * ファイル名の指定に誤りがある
  143.  
  144.     beq    nowild            *d0=0ならワイルドカード指定なし
  145.  
  146.     cmpi.w    #$00ff,d0        *d0≠FFHなら
  147.     bne    wild            * ワイルドカード指定あり
  148.  
  149. noname:                    *ファイル名が指定されていない場合
  150.     lea.l    arg(pc),a0        *バッファargに
  151.     lea.l    nambuf(pc),a1        * nameckで展開したパス名+'*.PCX'
  152.     bsr    strcpy            * を再構成する
  153.     lea.l    kome0(pc),a1        *
  154.     bsr    strcpy            *
  155.  
  156. wild:                    *ワイルドカードが指定された場合
  157.                     *何もしなくてよい
  158. cknam0:
  159.     rts
  160.  
  161. nowild:                    *ワイルドカードが指定されていない場合
  162.     move.w    #SUBDIR,-(sp)        *サブディレクトリであると仮定して
  163.     pea.l    arg(pc)            * 検索してみる
  164.     pea.l    filbuf(pc)        *
  165.     DOS    _FILES            *
  166.     lea.l    10(sp),sp        *
  167.     
  168.     tst.l    d0            *見つかったか?
  169.     bmi    cknam0            * 見つからなければファイルだろう
  170.  
  171.     lea.l    arg(pc),a0        *バッファargに
  172.     lea.l    komekome(pc),a1        * もとのファイル名+'\*.PCX'
  173.     bsr    strcat            * を再構成する
  174.  
  175.     bra    chkname            *nameckでファイル名を展開するために
  176.                     * サブルーチン先頭に戻る
  177.  
  178. *****************************************************************
  179. *    files,nfilesで見付けたファイル名をフルパスに構成し直し    *
  180. *        arg以降に格納する                *
  181. *****************************************************************
  182. setpath:
  183.     lea.l    arg(pc),a0        *a0=コピー先
  184.     lea.l    nambuf(pc),a1        *a1=nameckで展開したパス名
  185.     bsr    strcpy            *コピーする
  186.     lea.l    filbuf(pc),a1        *a1=files,nfilesで見付けたファイル名
  187.     lea.l    30(a1),a1
  188.     bsr    strcpy            *連結する
  189.     rts
  190.  
  191. *****************************************************************
  192. *    文字列の連結および複写                    *
  193. *    リターン時a0は文字列末の00Hを指す            *
  194. *****************************************************************
  195. strcat:
  196.     tst.b    (a0)+            *(a0)は0か?
  197.     bne    strcat            *そうでなければ繰り返す
  198.     subq.l    #1,a0            *行きすぎたから1つ戻る
  199. strcpy:
  200.     move.b    (a1)+,(a0)+        *1文字ずつ
  201.     bne    strcpy            *終了コードまでを転送する
  202.     subq.l    #1,a0            *a0は進み過ぎている
  203.                     *a0は文字列末の00Hを指す
  204.     rts
  205.  
  206. *****************************************************************
  207. *    拡張子を補う                        *
  208. *****************************************************************
  209. chkext:
  210.     lea.l    arg(pc),a0        *ファイル名のアドレス
  211.     lea.l    dext(pc),a1        *拡張子のアドレス
  212. chkext0:
  213.     cmp.b    #".",(a0)        *拡張子があるか
  214.     beq    chkext2
  215.     tst.b    (a0)+            *(a0)は0か?
  216.     bne    chkext0            *そうでなければ繰り返す
  217.     subq.l    #1,a0            *行きすぎたから1つ戻る
  218. chkext1:
  219.     move.b    (a1)+,(a0)+        *1文字転送
  220.     bne    chkext1            *終了コードまで繰り返す
  221. chkext2:
  222.     rts
  223.  
  224. *****************************************************************
  225. *    コマンドラインのチェックを行う                *
  226. *****************************************************************
  227. cmdchk:
  228.     lea.l    arg(pc),a0        *a0=引数切り出し領域
  229.     addq.l    #1,a2            *a2=コマンドライン文字列先頭
  230.     move.w    #1,clr_mode        *画面クリアモードの初期値
  231.     clr.w    bit4_crtdef        *16色PCXの画面モード初期値
  232.     clr.w    x_pos            *ロード座標の初期化
  233.     clr.w    y_pos
  234.  
  235. cmdchk0:
  236.     bsr    switch_chk        *スイッチのチェック
  237.  
  238.     tst.b    (a2)            *引数があるか?
  239.     beq    usage            *ないならファイル名が足りない
  240.     bsr    getarg            *ファイル名切り出し
  241.     bsr    switch_chk        *さらにスイッチのチェック
  242.     tst.b    (a2)            *引数があるか?
  243.     bne    usage            * あるなら引数が多い
  244. cmdchk1:
  245.     rts
  246.  
  247. *****************************************************************
  248. *    スペースを飛ばしつぎの引数先頭までポインタを進め    *
  249. *    スイッチがあれば処理してしまう                *
  250. *****************************************************************
  251. switch_chk:
  252.     bsr    skipsp            *スペースをスキップする
  253.     tst.b    (a2)            *まだスイッチがあるか?
  254.     beq    switch_chk2        *ないなら戻る(処理の振り分けを行う)
  255.  
  256.     cmpi.b    #'/',(a2)        *引数の先頭が
  257.     beq    switch_chk1        */,-であれば
  258.     cmpi.b    #'-',(a2)        *  スイッチ
  259.     beq    switch_chk1        *
  260.     bra    switch_chk2        *スイッチでないなら戻る
  261.  
  262. switch_chk1:
  263.     addq.l    #1,a2            *'/'や'-'の分ポインタを進める
  264.     tst.b    (a2)            *スイッチがあるか?
  265.     beq    usage            * ないなら使用方表示
  266.     move.b    (a2)+,d0        *1文字取り出す
  267.     bsr    toupper            *大文字に変換しておく
  268.  
  269.     cmpi.b    #'K',d0            *Kスイッチ?
  270.     beq    ksw            * そうなら分岐
  271.     cmpi.b    #'S',d0
  272.     beq    ssw
  273.     cmpi.b    #'C',d0
  274.     beq    csw
  275.     cmpi.b    #'L',d0
  276.     beq    lsw
  277.     cmpi.b    #'D',d0
  278.     beq    dsw
  279.     cmpi.b    #'M',d0
  280.     beq    msw
  281.     bra    usage            *無効なスイッチが指定された
  282.  
  283. ksw:
  284.     tst.b    kflg            *スイッチの二重指定チェック
  285.     bne    usage
  286.     st    kflg            *KスイッチON
  287.     bra    switch_chk        *まだスイッチがあるかもしれない
  288.  
  289. ssw:
  290.     bsr    ssw_ana
  291.     bra    switch_chk
  292.  
  293. csw:
  294.     bsr    csw_ana
  295.     bra    switch_chk
  296.  
  297. lsw:
  298.     bsr    lsw_ana
  299.     bra    switch_chk
  300.  
  301. dsw:
  302.     tst.b    dflg
  303.     bne    usage
  304.     st    dflg
  305.     bra    switch_chk
  306.  
  307. msw:
  308.     tst.b    mflg
  309.     bne    usage
  310.     st    mflg
  311.     bra    switch_chk
  312.  
  313. switch_chk2:
  314.     rts
  315.  
  316. *****************************************************************
  317. *    Sスイッチの解析                    *
  318. *****************************************************************
  319. ssw_ana:
  320.     tst.b    sflg            *Sスイッチの2重指定
  321.     bne    usage
  322.     st    sflg
  323.  
  324.     move.b    (a2),d0            *1文字取り出す
  325.     cmp.b    #' ',d0            *Sだけかな
  326.     beq    ssw_ana9        *画面モードの指定なし
  327. ssw_ana1:
  328.     bsr    num_read        *
  329.     cmp.w    crt_max(pc),d0        *
  330.     bhi    usage
  331.     move.w    d0,bit4_crtdef
  332.     subq.l    #1,a2            *1文字戻す
  333. ssw_ana9:
  334.     rts
  335.  
  336. *****************************************************************
  337. *    Cスイッチの解析                    *
  338. *****************************************************************
  339. csw_ana:
  340.     tst.b    cflg            *Cスイッチの2重指定
  341.     bne    usage
  342.     st    cflg
  343.  
  344. *    move.w    #3,clr_mode        */cだけのときは'3'をデフォルト
  345.  
  346.     move.b    (a2),d0            *1文字取り出す
  347.     cmp.b    #' ',d0            *Cだけかな
  348.     beq    csw_ana9        *画面クリアモードの指定なし
  349. csw_ana1:
  350.     bsr    num_read        *
  351.     cmp.w    #3,d0            *
  352.     bhi    usage
  353.     move.w    d0,clr_mode
  354.     subq.l    #1,a2            *1文字戻す
  355. csw_ana9:
  356.     rts
  357.  
  358. *****************************************************************
  359. *    Lスイッチの解析                    *
  360. *****************************************************************
  361. lsw_ana:
  362.     move.b    (a2),d0            *1文字取り出す
  363.     bsr    toupper            *大文字に変換しておく
  364.     cmp.b    #'C',d0            *LCかな
  365.     bne    lsw_ana1
  366.     tst.b    lflg            *Lスイッチも指定している
  367.     bne    usage
  368.     tst.b    lcflg            *LCスイッチの2重指定
  369.     bne    usage
  370.     st    lcflg            *LCスイッチオン
  371.     addq.l    #1,a2            *1文字進める
  372.     bra    lsw_ana9
  373. lsw_ana1:
  374.     cmp.b    #' ',d0            *Lだけかな
  375.     beq    lsw_ana9        *ロード座標を指定してない
  376. lsw_ana2:
  377.     bsr    num_read        *Xチェック
  378.     cmp.w    #1023,d0        *Xが1023を越える時
  379.     bhi    but_pos
  380.     move.w    d0,x_pos
  381.     cmp.b    #',',-1(a2)
  382.     bne    usage
  383.     bsr    num_read        *Yチェック
  384.     cmp.w    #1023,d0        *Yが1023を越える時
  385.     bhi    but_pos
  386.     move.w    d0,y_pos
  387.     st    lflg            *Lスイッチオン
  388.     subq.l    #1,a2            *1文字戻す
  389. lsw_ana9:
  390.     rts
  391.  
  392. *****************************************************************
  393. *    数字の解析    d0に数字を返す                *
  394. *****************************************************************
  395. num_read:
  396.     clr.w    d0
  397. num_read0:
  398.     clr.w    d1
  399.     move.b    (a2)+,d1
  400.     sub.b    #'0',d1
  401.     cmp.b    #10,d1
  402.     bcc.b    num_read1
  403.     mulu    #10,d0
  404.     add.w    d1,d0
  405.     bra.b    num_read0
  406. num_read1:
  407.     rts
  408.  
  409. *****************************************************************
  410. *    ファイル名を切り出す                    *
  411. *****************************************************************
  412. getarg:
  413.     move.l    a0,-(sp)        *{レジスタ待避
  414. gtarg0:    tst.b    (a2)            *1)文字列の終端コードか
  415.     beq    gtarg1            *
  416.     cmpi.b    #SPACE,(a2)        *2)スペースか
  417.     beq    gtarg1            *
  418.     cmpi.b    #TAB,(a2)        *3)タブか
  419.     beq    gtarg1            *
  420. *    cmpi.b    #'-',(a2)        *4)ハイフンか
  421. *    beq    gtarg1            *
  422.     cmpi.b    #'/',(a2)        *5)スラッシュ
  423.     beq    gtarg1            *
  424.     move.b    (a2)+,(a0)+        * が現れるまで転送を
  425.     bra    gtarg0            * 繰り返す
  426. gtarg1:    clr.b    (a0)            *文字列終端コードを書き込む
  427.     movea.l    (sp)+,a0        *}レジスタ復帰
  428.     rts
  429.  
  430. *****************************************************************
  431. *    スペース・TABをスキップする                *
  432. *****************************************************************
  433. skipsp0:
  434.     addq.l    #1,a2
  435. skipsp:
  436.     cmpi.b    #$20,(a2)
  437.     beq    skipsp0
  438.     cmpi.b    #$09,(a2)
  439.     beq    skipsp0
  440.     rts
  441.  
  442. *****************************************************************
  443. *    小文字→大文字変換ルーチン                *
  444. *****************************************************************
  445. toupper:
  446.     cmpi.b    #'a',d0
  447.     bcs    toupr0
  448.     cmpi.b    #'z'+1,d0
  449.     bcc    toupr0
  450.     subi.b    #$20,d0
  451. toupr0:
  452.     rts
  453.  
  454. *****************************************************************
  455. *    メイン処理                        *
  456. *****************************************************************
  457. main:
  458.     lea.l    arg(pc),a0        *ファイル名セット
  459.     bsr    file_open        *ファイルオープン
  460.     bsr    file_size        *ファイルサイズを調べる
  461.     move.l    d6,fi_size        *ファイルサイズセーブ
  462.  
  463.     movea.l    buff_addr(pc),a4    *バッファアドレス
  464.     move.l    #128,d6            *読み込むサイズ
  465.     bsr    file_read        *ヘッダ部分を読む
  466.  
  467.     bsr    size_chk        *画像サイズのチェック
  468.     tst.b    skip_flg
  469.     bne    main9
  470.  
  471.     bsr    crtmode_set        *画面モードの設定
  472.     bsr    scroll_var_set        *スクロール変数の設定
  473.     bsr    lsw_chk            *ロード座標・センタリングチェック
  474.  
  475.     tst.b    int_flg            *1回目のグラフィック初期化ここで行う
  476.     bne    main1
  477.     bsr    gr_off            *グラフィック画面オフ
  478.     bsr    scr_int            *画面の初期化
  479.     bsr    crtmode_int        *画面モードの初期化
  480.     bsr    scroll_int        *スクロール座標の初期化
  481.     bsr    gr_int            *グラフィック画面の初期化チェック
  482.  
  483. main1:
  484.     movea.l    buff_addr(pc),a4    *バッファアドレス
  485.     lea.l    128(a4),a4
  486.     move.l    fi_size(pc),d6
  487.     sub.l    #128,d6
  488.     bsr    file_read
  489.     bsr    file_close
  490.  
  491. main2:
  492.     bsr    pcx_tenkai        *PCX展開
  493.  
  494. main3:
  495.     tst.b    int_flg            *2回目以降のグラフィック初期化ここで行う
  496.     beq    main4
  497.     bsr    gr_off            *グラフィック画面オフ
  498.     bsr    crtmode_int        *画面モードの初期化
  499.     bsr    scroll_int        *スクロール座標の初期化
  500.     bsr    gr_int            *グラフィック画面の初期化チェック
  501.  
  502. main4:
  503.     bsr    pal_set            *パレット設定
  504.     bsr    gr_on            *グラフィック画面オン
  505.     bsr    inf_mode        *
  506.     bsr    pcx_prt            *PCX表示
  507.  
  508. main8:
  509.     bsr    scroll            *グラフィックをスクロール
  510.     add.w    #1,file_cnt        *ファイル数のカウント+1
  511.  
  512. main9:
  513.     rts
  514.  
  515. *****************************************************************
  516. *    ファイルヘッダから画像サイズを求める            *
  517. *****************************************************************
  518. size_chk:
  519.     movea.l    buff_addr(pc),a0    *読み込んだデータの先頭
  520.     cmp.l    #COL16,p_type(a0)    *16color?
  521.     beq    size_chk0
  522.     cmp.l    #COL256,p_type(a0)    *256 or Fullcolor?
  523.     beq    size_chk0
  524.     bsr    but_col_err
  525.     bra    size_chk9
  526.  
  527. size_chk0:
  528.     move.w    p_sx(a0),d0        *横サイズ求める
  529.     ror.w    #8,d0
  530.     move.w    p_ex(a0),d1
  531.     ror.w    #8,d1
  532.     sub.w    d0,d1
  533.     addq.w    #1,d1
  534.     move.w    d1,yoko
  535.  
  536.     move.w    p_sy(a0),d0        *縦サイズ求める
  537.     ror.w    #8,d0
  538.     move.w    p_ey(a0),d1
  539.     ror.w    #8,d1
  540.     sub.w    d0,d1
  541.     addq.w    #1,d1
  542.     move.w    d1,tate
  543.  
  544.     moveq.l    #0,d0            *使用ビット数
  545.     move.b    p_bpp(a0),d0
  546.     move.w    d0,bpp
  547.     move.b    p_npl(a0),d0
  548.     move.w    d0,npl
  549.     move.w    p_bpl(a0),d0
  550.     ror.w    #8,d0
  551.     move.w    d0,bpl
  552.  
  553.     cmp.b    #4,npl            *4プレーン以下か
  554.     bls    size_chk1        *そう
  555.     bsr    but_col_err
  556.     bra    size_chk9
  557.  
  558. size_chk1:
  559.     move.l    buff_addr(pc),d0    *ワークアドレスを求める
  560.     add.l    fi_size(pc),d0
  561.     btst.l    #0,d0
  562.     beq    size_chk2
  563.     addq.l    #1,d0
  564. size_chk2:
  565.     move.l    d0,work_addr
  566.  
  567.     move.w    bpp(pc),d1        *ワークサイズ求める
  568.     mulu.w    npl(pc),d1
  569.     move.w    d1,bit_cnt        *画像のビット数
  570.     mulu.w    bpl(pc),d1
  571.     btst.l    #0,d1
  572.     beq    size_chk3
  573.     addq.l    #1,d1
  574. size_chk3:
  575.     add.l    d0,d1            *グラフィック格納アドレス求める
  576.     addq.l    #4,d1            *謎の差分をたす
  577.     move.l    d1,gr_addr
  578.  
  579.     bsr    tenkai_size_get        *展開後のグラフィックサイズ求める
  580.     move.l    gr_addr(pc),d1        *表示するメモリがあるか
  581.     add.l    d0,d1
  582.     sub.l    buff_addr(pc),d1
  583.     cmp.l    buff_size(pc),d1
  584.     bls    size_chk8
  585.  
  586.     bsr    no_buff            *メモリが無い
  587.     bra    size_chk9
  588.  
  589. size_chk8:
  590.     sf    skip_flg
  591.     rts
  592.  
  593. size_chk9:
  594.     st    skip_flg
  595.     rts
  596.  
  597. tenkai_size_get:
  598.     cmp.w    #8,bit_cnt
  599.     bcs    ts4_get
  600.     beq    ts8_get
  601.     bra    ts24_get
  602. ts4_get:
  603.     move.w    yoko(pc),d0
  604.     addq.w    #7,d0
  605.     lsr.w    #1,d0
  606.     and.w    #$fffc,d0
  607.     bra    ts_get
  608. ts8_get:
  609.     move.w    yoko(pc),d0
  610.     addq.w    #3,d0
  611.     andi.w    #$fffc,d0
  612.     bra    ts_get
  613. ts24_get:
  614.     move.w    yoko(pc),d0
  615.     add.w    d0,d0
  616. *    bra    ts_get
  617. ts_get:
  618.     mulu.w    tate(pc),d0
  619.     rts
  620.  
  621. *****************************************************************
  622. *    ロード座標のチェック                    *
  623. *****************************************************************
  624. lsw_chk:
  625.     tst.b    lflg            *Lスイッチ指定
  626.     bne    l_chk            *指定あり
  627.     tst.b    lcflg            *LCスイッチ指定
  628.     bne    lc_chk            *指定あり
  629.     rts
  630.  
  631. l_chk:
  632.     move.w    x_pos(pc),d0        *横にはみ出るか
  633.     beq    l_chk1
  634.     add.w    yoko(pc),d0
  635.     cmp.w    crt_x(pc),d0
  636.     bhi    but_pos            *はみ出る
  637. l_chk1
  638.     move.w    y_pos(pc),d0        *縦にはみ出るか
  639.     beq    l_chk2
  640.     add.w    tate(pc),d0
  641.     cmp.w    crt_y(pc),d0
  642.     bhi    but_pos            *はみ出る
  643. l_chk2
  644.     rts
  645.  
  646. lc_chk:
  647.     clr.w    x_pos            *ロード座標の初期化
  648.     clr.w    y_pos
  649.  
  650.     move.w    crt_x(pc),d0        *X方向のセンタリング
  651.     sub.w    yoko(pc),d0
  652.     bmi    lc_chk1
  653.     lsr.w    #1,d0            *d0を1/2
  654.     move.w    d0,x_pos
  655. lc_chk1:
  656.     move.w    crt_y(pc),d0        *Y方向のセンタリング
  657.     sub.w    tate(pc),d0
  658.     bmi    lc_chk2
  659.     lsr.w    #1,d0            *d0を1/2
  660.     move.w    d0,y_pos
  661. lc_chk2:
  662.     rts
  663.  
  664. *****************************************************************
  665. *    パレット設定                        *
  666. *****************************************************************
  667. pal_set:
  668.     cmp.w    #8,bit_cnt
  669.     bcs    pal_set4
  670.     beq    pal_set8
  671.     bra    pal_set24
  672.  
  673. pal_set4:
  674.     move.l    buff_addr(pc),a0    *パレットアドレス
  675.     lea.l    p_pal(a0),a0        *変換元
  676.     movea.l    #GPAL,a1
  677.  
  678.     move.w    #16-1,d0        *パレット数
  679.  
  680. pal_set4_0:
  681.     move.w    #$00f8,d7        *マスクデータ
  682. pal_set4_1:
  683.     move.b    (a0)+,d3        *B
  684.     move.b    (a0)+,d2        *G
  685.     move.b    (a0)+,d1        *R
  686.     and.w    d7,d1
  687.     and.w    d7,d2
  688.     and.w    d7,d3
  689.     lsr.w    #2,d1
  690.     lsl.w    #3,d3
  691.     lsl.w    #8,d2
  692.     or.w    d2,d1
  693.     or.w    d3,d1
  694.     move.w    d1,(a1)+
  695.     dbra    d0,pal_set4_1
  696.     bra    pal_set_end
  697.  
  698. pal_set8:
  699.     move.l    buff_addr(pc),a0    *パレットアドレス
  700.     add.l    fi_size(pc),a0
  701.     sub.l    #256*3,a0
  702.  
  703.     movea.l    #GPAL,a1
  704.  
  705.     move.w    #256-1,d0        *パレット数
  706.     bra    pal_set4_0
  707.  
  708. pal_set24:                *65536色標準パレット
  709.     moveq.l    #$0001,d0
  710.     move.l    #$0202,d1
  711.     movea.l    #GPAL,a0
  712.  
  713.     moveq.l    #512/4-1,d2
  714. pal_set24_1:
  715.     move.w    d0,(a0)+
  716.     move.w    d0,(a0)+
  717.     add.l    d1,d0
  718.     dbra    d2,pal_set24_1
  719.  
  720. pal_set_end:
  721.     rts
  722.  
  723. *****************************************************************
  724. *    PCX展開                            *
  725. *****************************************************************
  726. pcx_tenkai:
  727.     move.l    buff_addr(pc),a2    *変換前画像アドレス
  728.     lea.l    p_image(a2),a2
  729.  
  730.     move.w    npl(pc),d0        *展開数を計算
  731.     mulu.w    bpl(pc),d0
  732.     move.w    d0,tenkai_cnt
  733.  
  734.     move.w    #$00c0,d3        *マスク用データ設定
  735.     move.w    #$003f,d4
  736.  
  737.     cmp.w    #8,bit_cnt
  738.     bcs    pcx4_ten
  739.     beq    pcx8_ten
  740.     bra    pcx24_ten
  741.  
  742. pcx4_ten:
  743.     movea.l    gr_addr(pc),a3        *コンバート先
  744.  
  745.     move.w    tate(pc),d7        *展開ライン数
  746.     cmp.w    #1024,d7
  747.     bls    pcx4_ten1
  748.     move.w    #1024,d7
  749. pcx4_ten1:
  750.     subq.w    #1,d7
  751.  
  752.     move.w    yoko(pc),d0        *水平→垂直変換数
  753.     addq.w    #7,d0
  754.     lsr.w    #3,d0
  755.     move.w    d0,d1
  756.     subq.w    #1,d0
  757.     move.w    d0,henkan_cnt
  758.  
  759. pcx4_ten2:
  760.     movea.l    work_addr(pc),a0    *展開先アドレス
  761.     bsr    pcx_ten            *ワークに展開
  762.     bsr    pcx4_conv        *コンバート
  763.     dbra.w    d7,pcx4_ten2
  764.     rts
  765.  
  766. pcx4_conv:
  767.     movea.l    work_addr(pc),a0    *展開もと
  768.     move.w    henkan_cnt(pc),d6    *ループ数
  769.     movea.w    ikisugi(pc),a1        *行き過ぎ
  770.  
  771.     move.w    d3,d5            *レジスタBackUp
  772.     swap.w    d5
  773.     move.w    d4,d5
  774.  
  775. pcx4_conv1:
  776.     move.w    bpl(pc),d0
  777.     movea.l    a0,a4
  778.     adda.w    d0,a4
  779.     movea.l    a4,a5
  780.     adda.w    d0,a5
  781.     movea.l    a5,a6
  782.     adda.w    d0,a6
  783.  
  784. pcx4_conv2:
  785.     move.b    (a0)+,d4
  786.     move.b    (a4)+,d3
  787.     move.b    (a5)+,d2
  788.     move.b    (a6)+,d1
  789.     add.b    d1,d1
  790.     roxl.b    #1,d0
  791.     add.b    d2,d2
  792.     roxl.b    #1,d0
  793.     add.b    d3,d3
  794.     roxl.b    #1,d0
  795.     add.b    d4,d4
  796.     roxl.b    #1,d0
  797.     add.b    d1,d1
  798.     roxl.b    #1,d0
  799.     add.b    d2,d2
  800.     roxl.b    #1,d0
  801.     add.b    d3,d3
  802.     roxl.b    #1,d0
  803.     add.b    d4,d4
  804.     roxl.b    #1,d0
  805.     move.b    d0,(a3)+
  806.     add.b    d1,d1
  807.     roxl.b    #1,d0
  808.     add.b    d2,d2
  809.     roxl.b    #1,d0
  810.     add.b    d3,d3
  811.     roxl.b    #1,d0
  812.     add.b    d4,d4
  813.     roxl.b    #1,d0
  814.     add.b    d1,d1
  815.     roxl.b    #1,d0
  816.     add.b    d2,d2
  817.     roxl.b    #1,d0
  818.     add.b    d3,d3
  819.     roxl.b    #1,d0
  820.     add.b    d4,d4
  821.     roxl.b    #1,d0
  822.     move.b    d0,(a3)+
  823.     add.b    d1,d1
  824.     roxl.b    #1,d0
  825.     add.b    d2,d2
  826.     roxl.b    #1,d0
  827.     add.b    d3,d3
  828.     roxl.b    #1,d0
  829.     add.b    d4,d4
  830.     roxl.b    #1,d0
  831.     add.b    d1,d1
  832.     roxl.b    #1,d0
  833.     add.b    d2,d2
  834.     roxl.b    #1,d0
  835.     add.b    d3,d3
  836.     roxl.b    #1,d0
  837.     add.b    d4,d4
  838.     roxl.b    #1,d0
  839.     move.b    d0,(a3)+
  840.     add.b    d1,d1
  841.     roxl.b    #1,d0
  842.     add.b    d2,d2
  843.     roxl.b    #1,d0
  844.     add.b    d3,d3
  845.     roxl.b    #1,d0
  846.     add.b    d4,d4
  847.     roxl.b    #1,d0
  848.     add.b    d1,d1
  849.     roxl.b    #1,d0
  850.     add.b    d2,d2
  851.     roxl.b    #1,d0
  852.     add.b    d3,d3
  853.     roxl.b    #1,d0
  854.     add.b    d4,d4
  855.     roxl.b    #1,d0
  856.     move.b    d0,(a3)+
  857.     dbra.w    d6,pcx4_conv2
  858.  
  859.     move.w    d5,d4            *レジスタ戻す
  860.     swap.w    d5
  861.     move.w    d5,d3
  862.  
  863.     rts
  864.  
  865.  
  866. pcx8_ten:
  867.     movea.l    gr_addr(pc),a3        *展開先
  868.     move.w    tate(pc),d7        *展開ライン数
  869.     subq.l    #1,d7
  870.     move.w    yoko(pc),d6
  871.     addq.w    #3,d6
  872.     andi.w    #$fffc,d6
  873. pcx8_ten1:
  874.     movea.l    a3,a0
  875.     bsr    pcx_ten            *直接展開
  876.     adda.w    d6,a3
  877.     dbra.w    d7,pcx8_ten1
  878.     rts
  879.  
  880.  
  881. pcx24_ten:
  882.     movea.l    gr_addr(pc),a3        *コンバート先
  883.  
  884.     move.w    tate(pc),d5        *縦ライン数
  885.     subq.l    #1,d5
  886.     move.w    #$00f8,d7        *マスクデータ
  887.  
  888.     tst.b    dflg            *ディザもどきあり?
  889.     beq    pcx24_ten2        *指定無し
  890.  
  891. pcx24_ten1:
  892.     movea.l    work_addr(pc),a0    *展開先アドレス
  893.     bsr    pcx_ten            *ワークに展開
  894.     bsr    pcx24_conv        *コンバート
  895.     dbra.w    d5,pcx24_ten1
  896.     bra    pcx24_ten3
  897.  
  898. pcx24_ten2:
  899.     movea.l    work_addr(pc),a0    *展開先アドレス
  900.     bsr    pcx_ten            *ワークに展開
  901.     bsr    pcx24_dnashi        *コンバート
  902.     dbra.w    d5,pcx24_ten2
  903. pcx24_ten3:
  904.     rts
  905.  
  906. pcx24_conv:
  907.     movem.l    d3-d7/a2,-(sp)
  908.     movea.l    work_addr(pc),a1    *展開もと
  909.  
  910.     move.w    bpl(pc),d0        *G・Rへのオフセット
  911.     movea.l    a1,a4
  912.     adda.w    d0,a4
  913.     movea.l    a4,a5
  914.     adda.w    d0,a5
  915.  
  916.     lea.l    d_pat(pc),a6
  917.     moveq.l    #3,d3
  918.  
  919.     move.w    yoko(pc),d6        *変換数
  920.     subq.w    #1,d6
  921.  
  922.     move.w    d5,d0
  923.     and.w    d3,d0
  924.     add.w    d0,d0
  925.     add.w    d0,d0
  926.     lea.l    0(a6,d0.w),a2
  927.  
  928. pcx24_conv3:
  929.     move.w    d6,d0
  930.     and.w    d3,d0
  931.     move.b    0(a2,d0.w),d0
  932.  
  933.     move.b    (a5)+,d1
  934.     add.b    d0,d1
  935.     bcc    pcx24_conv3_
  936.     moveq.l    #31*2,d1
  937.     bra    pcx24_conv4
  938. pcx24_conv3_:
  939.     and.w    d7,d1
  940.     lsr.b    #2,d1
  941.  
  942. pcx24_conv4:
  943.     move.b    (a4)+,d2
  944.     add.b    d0,d2
  945.     bcc    pcx24_conv4_
  946.     ori.w    #$f800,d1
  947.     bra    pcx24_conv5
  948. pcx24_conv4_:
  949.     and.w    d7,d2
  950. *    ror.w    #8,d2
  951.     move.b    d2,-(sp)        *ror.w    #8,d2の代わり
  952.     move.w    (sp)+,d2        *
  953.     clr.b    d2            *
  954.     or.w    d2,d1
  955.  
  956. pcx24_conv5:
  957.     move.b    (a1)+,d2
  958.     add.b    d0,d2
  959.     bcc    pcx24_conv5_
  960.     ori.w    #$07c0,d1
  961.     bra    pcx24_conv6
  962. pcx24_conv5_:
  963.     and.w    d7,d2
  964.     rol.w    #3,d2
  965.     or.w    d2,d1
  966.  
  967. pcx24_conv6:
  968.     move.w    d1,(a3)+
  969.     dbra    d6,pcx24_conv3
  970.     movem.l    (sp)+,d3-d7/a2
  971.     rts
  972.  
  973. pcx24_dnashi:
  974.     move.l    d3,a6
  975.  
  976.     movea.l    work_addr(pc),a1    *展開もと
  977.  
  978.     move.w    bpl(pc),d0        *G・Rへのオフセット
  979.     movea.l    a1,a4
  980.     adda.w    d0,a4
  981.     movea.l    a4,a5
  982.     adda.w    d0,a5
  983.  
  984.     move.w    yoko(pc),d6        *変換数
  985.     subq.w    #1,d6
  986.  
  987. pcx24_dnashi_:
  988.     move.b    (a1)+,d3        *B
  989.     move.b    (a4)+,d2        *G
  990.     move.b    (a5)+,d1        *R
  991.     and.w    d7,d1
  992.     and.w    d7,d2
  993.     and.w    d7,d3
  994.     lsr.w    #2,d1
  995.     lsl.w    #3,d3
  996. *    lsl.w    #8,d2
  997.     move.b    d2,-(sp)        *lsl.w    #8,d2の代わり
  998.     move.w    (sp)+,d2        *
  999.     clr.b    d2            *
  1000.     or.w    d2,d1
  1001.     or.w    d3,d1
  1002.     move.w    d1,(a3)+
  1003.     dbra.w    d6,pcx24_dnashi_
  1004.     move.l    a6,d3
  1005.     rts
  1006.  
  1007. *****************************************************************
  1008. *    展開ルーチン                        *
  1009. *****************************************************************
  1010. pcx_ten:
  1011.     move.w    tenkai_cnt(pc),d2    *展開数
  1012.     bra    pcx_ten1
  1013.  
  1014. pcx_ten0:
  1015.     subq.w    #1,d1
  1016. pcx_ten0_:
  1017.     move.b    d0,(a0)+
  1018.     dbra.w    d1,pcx_ten0_
  1019.  
  1020. pcx_ten1:
  1021.     move.b    (a2)+,d1        *数
  1022.     move.b    d1,d0
  1023.     and.w    d3,d0
  1024.     cmp.w    d3,d0
  1025.     beq    pcx_ten2
  1026.     move.b    d1,(a0)+
  1027.     subq.w    #1,d2
  1028.     bne    pcx_ten1
  1029.     rts
  1030.  
  1031. pcx_ten2:
  1032.     and.w    d4,d1            *かず
  1033.     move.b    (a2)+,d0        *いろ
  1034.     sub.w    d1,d2
  1035.     bne    pcx_ten0
  1036.  
  1037. pcx_ten3
  1038.     move.b    d0,(a0)+
  1039.     dbra.w    d1,pcx_ten3
  1040.     rts
  1041.  
  1042. *****************************************************************
  1043. *    グラフィックを表示する                    *
  1044. *****************************************************************
  1045. pcx_prt:
  1046.     cmp.w    #8,bit_cnt
  1047.     bcs    pcx4_prt
  1048.     beq    pcx8_prt
  1049.     bra    pcx24_prt
  1050.  
  1051. pcx4_prt:
  1052.     bsr    _pcx4_prt
  1053.     bra    pcx_prt_end
  1054. pcx8_prt:
  1055.     bsr    _pcx8_prt
  1056.     bra    pcx_prt_end
  1057. pcx24_prt:
  1058.     bsr    _pcx24_prt
  1059. *    bra    pcx_prt_end
  1060. pcx_prt_end:
  1061.     rts
  1062.  
  1063. *****************************************************************
  1064. *    画面モードの設定                    *
  1065. *****************************************************************
  1066. crtmode_set:
  1067.     cmp.w    #8,bit_cnt
  1068.     bcs    crtmode_set1
  1069.     beq    crtmode_set2
  1070.     bra    crtmode_set3
  1071.  
  1072. crtmode_set1:                *16色
  1073.     move.w    bit4_crtdef(pc),crt_mode
  1074.     move.w    #$04,vctr_r0
  1075.     move.w    #$30,vctr_r2
  1076.     bra    crtmode_set4
  1077.  
  1078. crtmode_set2:                *256色
  1079.     move.w    #5,crt_mode
  1080.     move.w    #$01,vctr_r0
  1081.     move.w    #$23,vctr_r2
  1082.     bra    crtmode_set4
  1083.  
  1084. crtmode_set3:                *32k色・1677色(Full)
  1085.     move.w    #6,crt_mode
  1086.     move.w    #$03,vctr_r0
  1087.     move.w    #$2f,vctr_r2
  1088.     bra    crtmode_set4
  1089. crtmode_set4:
  1090.     rts
  1091.  
  1092. *****************************************************************
  1093. *    スクロール変数の設定                    *
  1094. *****************************************************************
  1095. scroll_var_set:
  1096.     lea.l    dot_tbl(pc),a0        *ドット数テーブル
  1097.     move.w    crt_mode(pc),d0
  1098.     add.w    d0,d0
  1099.     add.w    d0,d0
  1100.     move.l    0(a0,d0.w),a0
  1101.  
  1102.     move.w    (a0),crt_x        *CRTのXドット数
  1103.     move.w    2(a0),crt_y        *     Yドット数
  1104.  
  1105.     move.w    yoko(pc),d0        *横スクロール出来るドット数を計算
  1106.     sub.w    crt_x(pc),d0
  1107.     bpl    sv_set0
  1108.     clr.w    d0
  1109. sv_set0:
  1110.     move.w    d0,x_max
  1111.  
  1112.     move.w    tate(pc),d0        *縦スクロール出来るドット数を計算
  1113.     sub.w    crt_y(pc),d0
  1114.     bpl    sv_set1
  1115.     clr.w    d0
  1116. sv_set1:
  1117.     move.w    d0,y_max
  1118.  
  1119.     cmp.w    #4,bit_cnt        *4bitか
  1120.     bne    sv_set4            *違う
  1121.  
  1122. sv_set2:                *4bit(16色)の時は、実画面スクロールのみ
  1123.     move.w    #1024,d0
  1124.     sub.w    crt_x(pc),d0
  1125.     cmp.w    x_max(pc),d0
  1126.     bcc    sv_set3
  1127.     move.w    d0,x_max
  1128. sv_set3:
  1129.  
  1130.     move.w    #1024,d0
  1131.     sub.w    crt_y(pc),d0
  1132.     cmp.w    y_max(pc),d0
  1133.     bcc    sv_set4
  1134.     move.w    d0,y_max
  1135. sv_set4:
  1136.     rts
  1137.  
  1138. *****************************************************************
  1139. *    画面の初期化を行う                    *
  1140. *****************************************************************
  1141. scr_int:
  1142.     st    int_flg            *画面の初期化は一回だけ
  1143.  
  1144.     move.w    clr_mode(pc),d0        *テキスト画面消去の指定があるか
  1145.     btst.l    #0,d0
  1146.     beq    scr_int9        *指定無し
  1147.  
  1148.     IOCS    _MS_CUROF        *マウスカーソル消す
  1149.     moveq.l    #0,d1            *ソフトキーボード消す
  1150.     moveq.l    #0,d2
  1151.     IOCS    _SKEY_MOD
  1152.     bsr    func_off        *ファンクションキー消す
  1153.     bsr    text_clr        *テキスト消去
  1154.     move.w    #$1e,d1            *カーソルをHOMEポジションへ
  1155.     IOCS    _B_PUTC
  1156. scr_int9:
  1157.     rts
  1158.  
  1159. *****************************************************************
  1160. *    画面のモードの初期化を行う                *
  1161. *****************************************************************
  1162. crtmode_int:
  1163.     move.w    vctr_r0(pc),$e82400    *色モード・実画面サイズ設定
  1164.     move.w    #$06e4,$e82500        *00_00_01_10_11100100
  1165.  
  1166.     cmp.w    #2,clr_mode        *グラフィック画面消去の指定
  1167.     bcs    crtmode_int1        *指定無し
  1168.  
  1169.     clr    $e82600            *GR・TEXT画面オフ
  1170.     bra    crtmode_int2
  1171. crtmode_int1:
  1172.     move.w    vctr_r2(pc),$e82600    *GR・TEXT画面オン
  1173. crtmode_int2:
  1174.     bsr    v_wait
  1175.     bsr    crtc_set        *crtcレジスタ設定
  1176.     rts
  1177.  
  1178. *****************************************************************
  1179. *    グラフィック画面の消去                    *
  1180. *****************************************************************
  1181. gr_int:
  1182.     cmp.w    #2,clr_mode        *グラフィック画面消去の指定が無い時は無視
  1183.     bcs    gr_int9            *指定無し
  1184.  
  1185. gr_int0:
  1186.     tst.b    mflg
  1187.     bne    gr_int1            *強制MPUクリア
  1188.  
  1189.     cmp.w    #4,bit_cnt        *16色以下か
  1190.     bhi    gr_int3            *違う
  1191.  
  1192.     move.w    yoko(pc),d0
  1193.     cmp.w    crt_x(pc),d0
  1194.     bhi    gr_int1
  1195.  
  1196.     move.w    tate(pc),d0
  1197.     cmp.w    crt_y(pc),d0
  1198.     bcs    gr_int3
  1199.  
  1200. gr_int1:
  1201.     move.w    $e80028,-(sp)
  1202.     movem.l    d0-d7/a0-a6,-(sp)
  1203.  
  1204.     move.b    #3,$e80028
  1205.  
  1206.     moveq.l    #0,d0            *レジスタクリア
  1207.     move.l    d0,d1
  1208.     move.l    d0,d2
  1209.     move.l    d0,d3
  1210.     move.l    d0,d4
  1211.     move.l    d0,d5
  1212.     move.l    d0,d6
  1213.     move.l    d0,d7
  1214.     movea.l    d0,a1
  1215.     movea.l    d0,a2
  1216.     movea.l    d0,a3
  1217.     movea.l    d0,a4
  1218.     movea.l    d0,a5
  1219.     movea.l    d0,a6
  1220.  
  1221.     movea.l    #GRAM_MAX,a0
  1222.     move.w    #512,line_cnt
  1223.  
  1224. gr_int2:
  1225.     movem.l    d0-d7/a1-a6,-(a0)    *14*4=56
  1226.     movem.l    d0-d7/a1-a6,-(a0)
  1227.     movem.l    d0-d7/a1-a6,-(a0)
  1228.     movem.l    d0-d7/a1-a6,-(a0)
  1229.     movem.l    d0-d7/a1-a6,-(a0)
  1230.     movem.l    d0-d7/a1-a6,-(a0)
  1231.     movem.l    d0-d7/a1-a6,-(a0)
  1232.     movem.l    d0-d7/a1-a6,-(a0)
  1233.     movem.l    d0-d7/a1-a6,-(a0)
  1234.     movem.l    d0-d7/a1-a6,-(a0)
  1235.     movem.l    d0-d7/a1-a6,-(a0)
  1236.     movem.l    d0-d7/a1-a6,-(a0)
  1237.     movem.l    d0-d7/a1-a6,-(a0)
  1238.     movem.l    d0-d7/a1-a6,-(a0)
  1239.     movem.l    d0-d7/a1-a6,-(a0)
  1240.     movem.l    d0-d7/a1-a6,-(a0)
  1241.     movem.l    d0-d7/a1-a6,-(a0)
  1242.     movem.l    d0-d7/a1-a6,-(a0)
  1243.     movem.l    d0-d3,-(a0)
  1244.     subq.w    #1,line_cnt
  1245.     bne    gr_int2
  1246.  
  1247.     movem.l    (sp)+,d0-d7/a0-a6
  1248.     move.w    (sp)+,$e80028
  1249.  
  1250.     bra    gr_int9
  1251.  
  1252. gr_int3:
  1253.     move.w    $e8002a,-(sp)        *ハードウェアクリア
  1254.     bsr    v_wait
  1255.     move.w    #$0f,$e8002a
  1256.     move.b    #$02,$e80481
  1257.     bsr    v_wait
  1258.     move.w    (sp)+,$e8002a
  1259.  
  1260. gr_int9:
  1261.     rts
  1262.  
  1263. *****************************************************************
  1264. *    グラフィックのオン                    *
  1265. *****************************************************************
  1266. gr_on:
  1267.     cmp.w    #2,clr_mode        *グラフィック画面消去の指定が無い時は無視
  1268.     bcs    gr_on1
  1269. gr_on0:
  1270.     bsr    v_wait
  1271.     move.w    vctr_r2(pc),$e82600    *GR・TEXT画面オン
  1272. gr_on1:
  1273.     rts
  1274.  
  1275. *****************************************************************
  1276. *    グラフィックのオフ                    *
  1277. *****************************************************************
  1278. gr_off:
  1279.     cmp.w    #2,clr_mode        *グラフィック画面消去の指定が無い時は無視
  1280.     bcs    gr_off1
  1281. gr_off0:
  1282.     bsr    v_wait
  1283.     clr.w    $e82600            *GR・TEXT画面オフ
  1284. gr_off1:
  1285.     rts
  1286.  
  1287. *****************************************************************
  1288. *    スクロール制御                        *
  1289. *****************************************************************
  1290. scroll:
  1291.     sf    esc_flg
  1292.     sf    next_flg
  1293.     sf    inkey_flg1
  1294.     sf    inkey_flg2
  1295.     sf    inkey_flg3
  1296.  
  1297.     cmp.w    #8,bit_cnt
  1298.     bcs    bit4_scroll
  1299.     beq    bit8_scroll
  1300.     bhi    bit24_scroll
  1301.  
  1302. bit4_scroll:
  1303.     bsr    _pcx4_scroll
  1304.     bra    scroll9
  1305. bit8_scroll:
  1306.     bsr    _pcx8_scroll
  1307.     bra    scroll9
  1308. bit24_scroll:
  1309.     bsr    _pcx24_scroll
  1310. *    bra    scroll9
  1311. scroll9:
  1312.     rts
  1313.  
  1314. *****************************************************************
  1315. *    キー入力チェック                    *
  1316. *****************************************************************
  1317. key_chk:
  1318.     movea.w    #$800,a0
  1319.     btst.b    #1,(a0)            *ESCが押されたか?
  1320.     beq    key_chk_        *押されていない
  1321.     st    esc_flg            *ESCスイッチON
  1322.     bra    key_chk9
  1323.  
  1324. key_chk_:
  1325.     btst.b    #7,1(a0)        *BSが押されたか?
  1326.     beq    key_chk0        *押されていない
  1327.     st    esc_flg            *ESCスイッチON
  1328.     bra    key_chk9
  1329.  
  1330. key_chk0:
  1331.     btst.b    #5,3(a0)        *RETURNが押されたか?
  1332.     beq    key_chk1        *押されていない
  1333.     st    next_flg        *NEXTスイッチON
  1334.     bra    key_chk9
  1335.  
  1336. key_chk1:
  1337.     btst.b    #5,6(a0)        *SPACEが押されたか?
  1338.     beq    key_chk2
  1339.     st    next_flg
  1340.     bra    key_chk9
  1341.  
  1342. key_chk2:
  1343.     btst.b    #6,9(a0)        *ENTERが押されたか?
  1344.     beq    key_chk3
  1345.     st    next_flg
  1346.     bra    key_chk9
  1347.  
  1348. key_chk3:
  1349.     btst.b    #6,6(a0)        *HOMEが押されたか?
  1350.     beq    key_chk4
  1351.     tst.b    inkey_flg1
  1352.     bne    key_chk9
  1353.     st    inkey_flg1
  1354.     bsr    inf_change        *情報表示の変更
  1355.     bra    key_chk9
  1356.  
  1357. key_chk4:
  1358.     btst.b    #2,7(a0)        *UNDOが押されたか?
  1359.     beq    key_chk8
  1360.     tst.b    inkey_flg1
  1361.     bne    key_chk9
  1362.     st    inkey_flg1
  1363.     bsr    inf_change        *情報表示の変更
  1364.     bra    key_chk9
  1365.  
  1366. key_chk8:
  1367.     sf    inkey_flg1
  1368.  
  1369. key_chk9:
  1370.     rts
  1371.  
  1372. *****************************************************************
  1373. *    カーソル入力チェック                    *
  1374. *****************************************************************
  1375. cursor_chk:
  1376.     movea.w    #$807,a0        *カーソルキーのチェック
  1377.     move.b    (a0),d0
  1378.     ror.b    #3,d0
  1379.     andi.w    #$000f,d0
  1380.     move.b    d0,scroll_key
  1381.     rts
  1382.  
  1383. *****************************************************************
  1384. *    テンキー入力チェック                    *
  1385. *****************************************************************
  1386. tenkey_chk:
  1387.     movea.w    #$808,a0
  1388.     lea.l    scroll_key(pc),a1
  1389.     btst.b    #4,(a0)            *8押されたか?
  1390.     beq    tenkey_chk0        *押されていない
  1391.     or.b    #2,(a1)            *上セット
  1392. tenkey_chk0:
  1393.     btst.b    #7,(a0)            *4が押されたか?
  1394.     beq    tenkey_chk1        *押されていない
  1395.     or.b    #1,(a1)            *右セット
  1396. tenkey_chk1:
  1397.     movea.w    #$809,a0
  1398.     btst.b    #1,(a0)            *6が押されたか?
  1399.     beq    tenkey_chk2        *押されていない
  1400.     or.b    #4,(a1)            *左セット
  1401. tenkey_chk2:
  1402.     btst.b    #4,(a0)            *2が押されたか?
  1403.     beq    tenkey_chk3        *押されていない
  1404.     or.b    #8,(a1)            *下セット
  1405. tenkey_chk3:
  1406.     rts
  1407.  
  1408. *****************************************************************
  1409. *    マウスの入力チェック                    *
  1410. *****************************************************************
  1411. mouse_chk:
  1412.     IOCS    _MS_GETDT        *マウスからのデータをGET
  1413.  
  1414.     cmpi.b    #$ff,d0            *右ボタンが押されたか
  1415.     beq    mouse_right        *押された
  1416.     andi.w    #$ff00,d0        *左ボタンが押されたか
  1417.     bne    mouse_left        *押された
  1418.     sf    inkey_flg2
  1419.     bra    mouse_chk1
  1420.  
  1421. mouse_right:
  1422.     andi.w    #$ff00,d0        *更に左ボタンが押されたか
  1423.     bne    mouse_right1        *押された
  1424.  
  1425.     tst.b    inkey_flg2
  1426.     bne    mouse_right0
  1427.     st    inkey_flg2
  1428.     bsr    inf_change        *情報表示の変更
  1429.  
  1430. mouse_right0:
  1431.     IOCS    _MS_GETDT        *マウスからのデータをGET
  1432.     andi.w    #$ff00,d0        *左ボタンが押されたか
  1433.     beq    mouse_chk1        *押されていない
  1434.  
  1435. mouse_right1:
  1436.     st    esc_flg            *ESCスイッチON
  1437.     bra    mouse_chk1
  1438.  
  1439. mouse_left:
  1440.     st    next_flg        *NEXTスイッチON
  1441.  
  1442. mouse_chk1:
  1443.     swap    d0
  1444.     move.w    d0,d1
  1445.     andi.w    #$ff00,d0        *上位を残す
  1446.     andi.w    #$00ff,d1        *下位を残す
  1447.     ror.w    #8,d0            *
  1448.     lea.l    scroll_key(pc),a1
  1449.  
  1450. ms_xp:                    *X方向の移動量を調べる
  1451.     tst.b    d0            *移動量がプラス方向か?
  1452.     beq    ms_yp            *入力なし
  1453.     blt    ms_xm            *マイナスなら飛ぶ
  1454.  
  1455.     cmp.b    #1,d0
  1456.     bls    ms_yp            *移動量が少なければ無視
  1457.     or.b    #4,(a1)            *右セット
  1458.     bra    ms_yp
  1459. ms_xm:
  1460.     cmp.b    #-1,d0
  1461.     bcc    ms_yp
  1462.     or.b    #1,(a1)            *左セット
  1463. *    bra    ms_yp
  1464.  
  1465. ms_yp:                    *Y方向の移動量を調べる
  1466.     tst.b    d1            *移動量がプラス方向か?
  1467.     beq    mouse_chk9        *入力なし
  1468.     blt    ms_ym            *マイナスなら飛ぶ
  1469.  
  1470.     cmp.b    #1,d1
  1471.     bls    mouse_chk9        *移動量が少なければ無視
  1472.     or.b    #8,(a1)            *下セット
  1473.     bra    mouse_chk9
  1474. ms_ym:
  1475.     cmp.b    #-1,d1
  1476.     bcc    mouse_chk9
  1477.     or.b    #2,(a1)            *上セット
  1478. *    bra    mouse_chk9
  1479. mouse_chk9:
  1480.     rts
  1481.  
  1482. *****************************************************************
  1483. *    CRTCの値を設定する                    *
  1484. *****************************************************************
  1485. crtc_set:
  1486.     lea.l    crtc_tbl(pc),a0
  1487.     move.w    crt_mode(pc),d0
  1488.     add.w    d0,d0
  1489.     add.w    d0,d0
  1490.     move.l    0(a0,d0.w),a0
  1491.  
  1492.     tst.w    (a0)+            *HRL=0?
  1493.     beq    crtc_set0
  1494.     or.b    #%0010,$e8e007        *HRLビットを立てる
  1495.     bra    crtc_set1
  1496. crtc_set0:
  1497.     bclr.b    #1,$e8e007        *HRLビットを消す
  1498. crtc_set1:
  1499.     movea.l    #$e80000,a1
  1500.     move.w    (a0)+,$28(a1)        *crtc r20
  1501.  
  1502.     move.l    (a0)+,(a1)+        *crtc r00-r08
  1503.     move.l    (a0)+,(a1)+
  1504.     move.l    (a0)+,(a1)+
  1505.     move.l    (a0)+,(a1)+
  1506.     move.w    (a0),(a1)
  1507.     rts
  1508.  
  1509. *****************************************************************
  1510. *    情報の表示/非表示の変更を行う                *
  1511. *****************************************************************
  1512. inf_change:
  1513.     add.b    #1,prt_flg
  1514.     cmp.b    #2,prt_flg
  1515.     bcs    inf_change1
  1516.     beq    inf_change2
  1517.     bra    inf_change0
  1518.  
  1519. inf_change0:
  1520.     bsr    inf_off            *情報消去
  1521.     bsr    _Tone_up
  1522.     clr.b    prt_flg
  1523.     bra    inf_change9
  1524. inf_change1:
  1525.     bsr    inf_prt            *情報表示
  1526.     bra    inf_change9
  1527. inf_change2:
  1528.     bsr    _Tone_down
  1529. inf_change9:
  1530.     rts
  1531.  
  1532. inf_mode:
  1533.     cmp.b    #1,prt_flg
  1534.     bcs    inf_mode9
  1535.     beq    inf_mode1
  1536.     bra    inf_mode2
  1537. inf_mode1:
  1538.     bsr    inf_prt            *情報表示
  1539.     bra    inf_mode9
  1540. inf_mode2:
  1541.     bsr    inf_prt            *情報表示
  1542.     bsr    _Tone_down
  1543. inf_mode9:
  1544.     rts
  1545.  
  1546. *****************************************************************
  1547. *    情報の表示                        *
  1548. *****************************************************************
  1549. inf_prt:
  1550.     tst.b    prt_flg
  1551.     beq    inf_prt9        *ゼロなら表示しない
  1552.  
  1553.     bsr    v_wait
  1554.     bsr    inf_off
  1555.     bsr    name_prt        *ファイル名の表示
  1556.     bsr    size_prt        *サイズの表示
  1557.     bsr    col_prt            *色数の表示
  1558. inf_prt9:
  1559.     rts
  1560.  
  1561. *****************************************************************
  1562. *    ファイル名の表示                    *
  1563. *****************************************************************
  1564. name_prt:
  1565.     lea.l    prt_buf(pc),a0        *表示バッファの先頭アドレス
  1566.     lea.l    inf1(pc),a1        *'ファイル名:'をコピー
  1567.     bsr    strcpy
  1568.  
  1569.     lea.l    filbuf(pc),a1        *ファイル名をコピーする
  1570.     lea.l    30(a1),a1        *
  1571.     bsr    strcpy
  1572.  
  1573.     lea.l    crlf_mes(pc),a1        *改行コードをコピー
  1574.     bsr    strcpy
  1575.  
  1576.     lea.l    prt_buf(pc),a1
  1577.     IOCS    _B_PRINT        *ファイル名を表示
  1578.     rts
  1579.  
  1580. *****************************************************************
  1581. *    画像サイズの表示                    *
  1582. *****************************************************************
  1583. size_prt:
  1584.     lea.l    prt_buf(pc),a0        *コピー先
  1585.     lea.l    inf2(pc),a1        *'画像サイズ:'をコピー
  1586.     bsr    strcpy
  1587.  
  1588.     movea.l    a0,a2
  1589.     moveq.l    #0,d0            *横サイズ
  1590.     move.w    yoko(pc),d0
  1591.     bsr    suji_set
  1592.     move.b    #'x',(a2)+        *'x'
  1593.  
  1594.     moveq.l    #0,d0            *縦サイズ
  1595.     move.w    tate(pc),d0
  1596.     bsr    suji_set
  1597.  
  1598.     movea.l    a2,a0
  1599.     lea.l    crlf_mes(pc),a1        *改行コードをコピー
  1600.     bsr    strcpy
  1601.  
  1602.     lea.l    prt_buf(pc),a1
  1603.     IOCS    _B_PRINT        *画像サイズを表示
  1604.     rts
  1605.  
  1606. *****************************************************************
  1607. *    色数の表示                        *
  1608. *****************************************************************
  1609. col_prt:
  1610.     lea.l    prt_buf(pc),a0        *コピー先
  1611.     lea.l    inf3(pc),a1        *'色数   :'をコピー
  1612.     bsr    strcpy
  1613.  
  1614.     move.w    bit_cnt(pc),d0
  1615.     cmp.w    #8,d0            *256色
  1616.     bcs    col_4
  1617.     beq    col_8
  1618.     cmp.w    #24,d0            *Full color(16777216)
  1619.     beq    col_24
  1620.     bra    col_??            *不明
  1621. col_4:
  1622.     lea.l    col4(pc),a1
  1623.     bra    col_set
  1624. col_8:
  1625.     lea.l    col8(pc),a1
  1626.     bra    col_set
  1627. col_24:
  1628.     lea.l    col24(pc),a1
  1629.     bra    col_set
  1630. col_??:
  1631.     lea.l    col??(pc),a1
  1632. *    bra    col_set
  1633. col_set
  1634.     bsr    strcpy            *色数をコピー
  1635.  
  1636.     lea.l    crlf_mes(pc),a1        *改行コードをコピー
  1637.     bsr    strcpy
  1638.  
  1639.     lea.l    prt_buf(pc),a1
  1640.     IOCS    _B_PRINT        *色数を表示
  1641.     rts
  1642.  
  1643. *****************************************************************
  1644. *    数字の設定                        *
  1645. *****************************************************************
  1646. suji_set:
  1647.     lea.l    num_buf(pc),a0
  1648.     move.b    #0,11(a0)        *終了位置
  1649.     bsr    bin2dec
  1650.     bsr    zero_keshi
  1651. suji_set1:
  1652.     move.b    (a0)+,(a2)+
  1653.     bne    suji_set1
  1654.     subq.l    #1,a2
  1655.     rts
  1656.  
  1657. *****************************************************************
  1658. *    2進=>10進                        *
  1659. *    d0 変換元の数値 a0 変換後の格納アドレス            *
  1660. *****************************************************************
  1661. bin2dec:
  1662.     movem.l    d0-d3/a0-a1,-(sp)
  1663.     moveq.l    #10-1,d1
  1664.     lea.l    exp_tbl(pc),a1
  1665. bin2dec0:
  1666.     clr.b    d2
  1667.     move.l    (a1)+,d3
  1668. bin2dec1:
  1669.     or    d3,d3
  1670.     sub.l    d3,d0
  1671.     bcs    bin2dec2
  1672.     addq.b    #1,d2
  1673.     bra    bin2dec1
  1674. bin2dec2:
  1675.     add.l    d3,d0
  1676.     add.b    #'0',d2
  1677.     move.b    d2,(a0)+
  1678.     dbra    d1,bin2dec0
  1679.     movem.l    (sp)+,d0-d3/a0-a1
  1680.     rts
  1681.  
  1682. exp_tbl:
  1683.     .dc.l    1000000000
  1684.     .dc.l    100000000
  1685.     .dc.l    10000000
  1686.     .dc.l    1000000
  1687.     .dc.l    100000
  1688.     .dc.l    10000
  1689.     .dc.l    1000
  1690.     .dc.l    100
  1691.     .dc.l    10
  1692.     .dc.l    1
  1693.  
  1694. *****************************************************************
  1695. *    頭にある'0'を消す                    *
  1696. *****************************************************************
  1697. zero_keshi:
  1698.     lea.l    num_buf(pc),a0
  1699.     move.w    #9-1,d0            *最期の'0'は残す
  1700. zero_keshi0:
  1701.     cmp.b    #'0',(a0)
  1702.     bne    zero_keshi9
  1703.     move.b    #SPACE,(a0)+
  1704. zero_keshi1:
  1705.     dbra    d0,zero_keshi0
  1706. zero_keshi9:
  1707.     rts
  1708.  
  1709. *****************************************************************
  1710. *    情報の消去                        *
  1711. *****************************************************************
  1712. inf_off:
  1713.     move.w    #$1a,d1            *TEXTクリア&HOMEポジションへ
  1714.     IOCS    _B_PUTC
  1715.     rts
  1716.  
  1717. *****************************************************************
  1718. *    ファイルのOPENを行う                *
  1719. *****************************************************************
  1720. file_open:
  1721.     move.w    #0,-(sp)        *ファイルopen
  1722.     move.l    a0,-(sp)
  1723.     DOS    _OPEN
  1724.     addq.l    #6,sp
  1725.     tst.l    d0            *OK?
  1726.     bmi    open_err
  1727.     move.l    d0,d7            *ファイルハンドルセーブ
  1728.     rts
  1729.  
  1730. *****************************************************************
  1731. *    ファイルのサイズを求める(d6に返す)            *
  1732. *****************************************************************
  1733. file_size:
  1734.     move.w    #2,-(sp)
  1735.     move.l    #0,-(sp)
  1736.     move.w    d7,-(sp)
  1737.     DOS    _SEEK
  1738.     addq.l    #8,sp
  1739.     tst.l    d0            *OK?
  1740.     bmi    read_err
  1741.  
  1742.     move.l    d0,d6
  1743.  
  1744.     move.w    #0,-(sp)
  1745.     move.l    #0,-(sp)
  1746.     move.w    d7,-(sp)
  1747.     DOS    _SEEK
  1748.     addq.l    #8,sp
  1749.     tst.l    d0            *OK?
  1750.     bmi    read_err
  1751.     rts
  1752.  
  1753. *****************************************************************
  1754. *    ディスクからデータの読み込みを行う            *
  1755. *****************************************************************
  1756. file_read:
  1757.     move.l    d6,-(sp)        *データサイズ
  1758.     move.l    a4,-(sp)        *バッファアドレス
  1759.     move.w    d7,-(sp)        *ファイルハンドル
  1760.     DOS    _READ
  1761.     lea    10(sp),sp        *スタック補正
  1762.     tst.l    d0            *OK?
  1763.     bmi    read_err
  1764.     cmp.l    d6,d0            *全部読めたか
  1765.     bne    read_err
  1766.     rts
  1767.  
  1768. *****************************************************************
  1769. *    ファイルをCLOSEする                *
  1770. *****************************************************************
  1771. file_close:
  1772.     move.w    d7,-(sp)        *ファイルCLOSE
  1773.     DOS    _CLOSE
  1774.     addq.l    #2,sp
  1775.     rts
  1776.  
  1777. *****************************************************************
  1778. *    スクロール画面の初期化                    *
  1779. *****************************************************************
  1780. scroll_int:
  1781.     clr.w    d2            *スクロール座標初期化
  1782.     clr.w    d3
  1783.     bsr    x_set
  1784.     bsr    y_set
  1785.     rts
  1786.  
  1787. *****************************************************************
  1788. *    グラフィック画面のスクロールを行う            *
  1789. *****************************************************************
  1790. go_scroll:
  1791.     bsr    v_wait
  1792.     bsr    x_set
  1793.     bsr    y_set
  1794.     rts
  1795.  
  1796. *****************************************************************
  1797. *    スクロールX座標セット                    *
  1798. *****************************************************************
  1799. x_set:
  1800.     movea.l    #$e80000,a0
  1801.     move.w    d2,d0            *X座標
  1802.     move.w    d0,crtc_r12(a0)
  1803.     move.w    d0,crtc_r14(a0)
  1804.  
  1805.     cmp.w    #8,bit_cnt        *8BitColor
  1806.     bne    x_set1
  1807.     add.w    #256,d0            *page1のX座標(256色)
  1808. x_set1:
  1809.     move.w    d0,crtc_r16(a0)
  1810.     move.w    d0,crtc_r18(a0)
  1811.     rts
  1812.  
  1813. *****************************************************************
  1814. *    スクロールY座標セット                    *
  1815. *****************************************************************
  1816. y_set:
  1817.     movea.l    #$e80000,a0
  1818.     move.w    d3,crtc_r13(a0)        *スクリーン0のY座標
  1819.     move.w    d3,crtc_r15(a0)        *スクリーン1のY座標
  1820.     move.w    d3,crtc_r17(a0)        *スクリーン2のY座標
  1821.     move.w    d3,crtc_r19(a0)        *スクリーン3のY座標
  1822.     rts
  1823.  
  1824. *****************************************************************
  1825. *    画面の動機待ち                        *
  1826. *****************************************************************
  1827. v_wait:
  1828.     movea.l    #$e88001,a0
  1829.     moveq.l    #4,d0
  1830. v_wait0:
  1831.     btst.b    d0,(a0)
  1832.     beq    v_wait0
  1833. v_wait1:
  1834.     btst.b    d0,(a0)
  1835.     bne    v_wait1
  1836.     rts
  1837.  
  1838. *****************************************************************
  1839. *    テキスト画面の消去                    *
  1840. *****************************************************************
  1841. text_clr:
  1842.     movem.l    d0-d3/a3,-(sp)
  1843.     move.w    $E8002A,d0
  1844.     move.w    #%0000_0001_1111_0000,$E8002A
  1845.     movea.l    #TEXT1,a3
  1846.     move.w    #1024-1,d1
  1847. text_clr_lp:
  1848.     clr.l    (a3)+
  1849.     dbra.w    d1,text_clr_lp
  1850.     move.w    d0,$E8002A
  1851.  
  1852.     move.w    #$0001,d1
  1853.     move.w    #255,d2
  1854.     move.w    #$000F,d3
  1855.     IOCS    _TXRASCPY
  1856.     movem.l    (sp)+,d0-d3/a3
  1857.     rts
  1858.  
  1859. *****************************************************************
  1860. *    waitデータのパス名を設定                *
  1861. *****************************************************************
  1862. wait_path_set:
  1863.     lea.l    $80(a0),a1        *転送元
  1864.     lea.l    arg2(pc),a0        *転送先
  1865.     bsr    strcpy
  1866.     lea.l    wait_name(pc),a1    *指定したファイル名
  1867.     bsr    strcpy
  1868.     rts
  1869.  
  1870. *****************************************************************
  1871. *    waitデータ'bmp256.dat'を読み込む            *
  1872. *****************************************************************
  1873. wait_read:
  1874.     move.w    #0,-(sp)        *ファイルopen
  1875.     pea.l    arg2(pc)
  1876.     DOS    _OPEN
  1877.     addq.l    #6,sp
  1878.     tst.l    d0            *OK?
  1879.     bmi    wait_read9
  1880.  
  1881.     move.l    d0,d7            *ファイルハンドルセーブ
  1882.  
  1883.     move.l    #2,-(sp)        *データサイズ
  1884.     pea.l    _Wait(pc)        *バッファアドレス
  1885.     move.w    d7,-(sp)        *ファイルハンドル
  1886.     DOS    _READ
  1887.     lea    10(sp),sp        *スタック補正
  1888.  
  1889.     move.w    _Wait(pc),wait        *ワークに取っておく
  1890.  
  1891. *    tst.l    d0            *OK?
  1892. *    bmi    read_err
  1893. *    cmp.l    d6,d0            *全部読めたか
  1894. *    bne    read_err
  1895.  
  1896.     bsr    file_close
  1897.  
  1898. wait_read9:
  1899.     rts
  1900.  
  1901. *****************************************************************
  1902. *    waitデータ'bmp256.dat'を書き込む            *
  1903. *****************************************************************
  1904. wait_write:
  1905.     move.w    wait(pc),d0
  1906.     cmp.w    _Wait(pc),d0
  1907.     beq    wait_write9
  1908.  
  1909.     move.w    #$20,-(sp)        *ファイルCREATE
  1910.     pea.l    arg2(pc)
  1911.     DOS    _CREATE
  1912.     addq.l    #6,sp
  1913.  
  1914. *    tst.l    d0        *OK?
  1915. *    bmi    create_err
  1916.     tst.l    d0        *OK?
  1917.     bmi    wait_write9
  1918.  
  1919.     move.l    d0,d7            *ファイルハンドルセーブ
  1920.  
  1921.     move.l    #2,-(sp)        *データサイズ
  1922.     pea.l    _Wait(pc)        *バッファアドレス
  1923.     move.w    d7,-(sp)        *ファイルハンドル
  1924.     DOS    _WRITE
  1925.     lea.l    10(sp),sp        *スタック補正
  1926.  
  1927. *    tst.l    d0            *OK?
  1928. *    bmi    write_err
  1929. *    cmp.l    d6,d0            *全部書き込めたか?
  1930. *    bne    write_err
  1931.  
  1932.     bsr    file_close
  1933.  
  1934.     lea.l    wait_change_mes(pc),a0
  1935.     bsr    mesput
  1936.  
  1937. wait_write9:
  1938.     rts
  1939.  
  1940. *****************************************************************
  1941. *    カーソル消す                        *
  1942. *****************************************************************
  1943. cursol_clr:
  1944.     move.b    $992.w,cur_save
  1945.     beq    cursol_clr9
  1946.     IOCS    _OS_CUROF
  1947.  
  1948. cursol_clr9:
  1949.     rts
  1950.  
  1951. *****************************************************************
  1952. *    カーソル戻す                        *
  1953. *****************************************************************
  1954. cursol_recv:
  1955.     tst.b    cur_save
  1956.     beq    cursol_recv9
  1957.     IOCS    _OS_CURON
  1958.  
  1959. cursol_recv9:
  1960.     rts
  1961.  
  1962. *****************************************************************
  1963. *    バッファ確保                        *
  1964. *****************************************************************
  1965. buf_get:
  1966.     pea.l    -1.w            *確保出来る最大サイズを取得
  1967.     DOS    _MALLOC
  1968.     addq.l    #4,sp
  1969.     andi.l    #$00ffffff,d0
  1970.     move.l    d0,d1
  1971.     move.l    d0,-(sp)
  1972.     DOS    _MALLOC
  1973.     addq.l    #4,sp
  1974.     tst.l    d0
  1975.     bmi    no_buff
  1976.  
  1977.     move.l    d0,buff_addr        *バッファアドレス
  1978.     move.l    d1,buff_size        *バッファサイズ
  1979.     rts
  1980.  
  1981. *****************************************************************
  1982. *    バッファ開放                        *
  1983. *****************************************************************
  1984. buf_free:
  1985.     pea.l    buff_addr(pc)        *バッファ開放
  1986.     DOS    _MFREE
  1987.     addq.l    #4,sp
  1988.     rts
  1989.  
  1990. *****************************************************************
  1991. *    スーパーモードにする                    *
  1992. *****************************************************************
  1993. super:
  1994.     clr.l    -(sp)            *スーパーバイザモードへ移行
  1995.     DOS    _SUPER
  1996.     addq.l    #4,sp
  1997.     move.l    d0,sp_save
  1998.     rts
  1999.  
  2000. *****************************************************************
  2001. *    ユーザーモードにする                    *
  2002. *****************************************************************
  2003. user:
  2004.     move.l    sp_save(pc),-(sp)    *ユーザーモードへ
  2005.     DOS    _SUPER
  2006.     addq.l    #4,sp
  2007.     rts
  2008.  
  2009. *****************************************************************
  2010. *    ファンクション表示を消す                *
  2011. *****************************************************************
  2012. func_off:
  2013.     lea.l    func_off_mes(pc),a0
  2014.     bsr    mesput
  2015.     rts
  2016.  
  2017. *****************************************************************
  2018. *    処理したファイル数をチェックする            *
  2019. *****************************************************************
  2020. file_cnt_chk:
  2021.     tst.w    file_cnt        *処理したファイルは0個か
  2022.     bne    file_cnt_chk1        *違う
  2023.     bsr    no_file            *ファイルが無かった
  2024. file_cnt_chk1:
  2025.     rts
  2026.  
  2027. *****************************************************************
  2028. *    処理するファイルがなかった                *
  2029. *****************************************************************
  2030. no_file:
  2031.     lea.l    no_file_mes(pc),a0
  2032.     bsr    mesput
  2033.     rts
  2034.  
  2035. *****************************************************************
  2036. *    ファイル名エラー                    *
  2037. *****************************************************************
  2038. name_er:
  2039.     lea.l    name_er_mes(pc),a0
  2040.     bsr    mesput
  2041.     bra    exit2
  2042.  
  2043. *****************************************************************
  2044. *    ファイルが見付からない                    *
  2045. *****************************************************************
  2046. open_err:
  2047.     lea.l    arg(pc),a0
  2048.     bsr    mesput
  2049.     lea.l    open_er_mes(pc),a0
  2050.     bsr    mesput
  2051.     bra    exit2
  2052.  
  2053. *****************************************************************
  2054. *    メモリが足りない                    *
  2055. *****************************************************************
  2056. no_buff:
  2057.     bsr    file_close
  2058.     lea.l    arg(pc),a0
  2059.     bsr    mesput
  2060.     lea.l    no_buff_mes(pc),a0
  2061.     bsr    mesput
  2062.     rts
  2063.  
  2064. *****************************************************************
  2065. *    色違い                            *
  2066. *****************************************************************
  2067. but_col_err:
  2068.     bsr    file_close
  2069.     lea.l    arg(pc),a0
  2070.     bsr    mesput
  2071.     lea.l    but_col_mes(pc),a0
  2072.     bsr    mesput
  2073.     rts
  2074.  
  2075. *****************************************************************
  2076. *    ロード座標エラー                    *
  2077. *****************************************************************
  2078. but_pos:
  2079.     bsr    file_close        *ファイルクローズ
  2080.     lea.l    arg(pc),a0
  2081.     bsr    mesput
  2082.     lea.l    but_pos_mes(pc),a0
  2083.     bsr    mesput
  2084.     bra    exit2
  2085.  
  2086. *****************************************************************
  2087. *    読み込みエラー                        *
  2088. *****************************************************************
  2089. read_err:
  2090.     lea.l    arg(pc),a0
  2091.     bsr    mesput
  2092.     lea.l    read_er_mes(pc),a0
  2093.     bsr    mesput
  2094.     bra    exit2
  2095.  
  2096. *****************************************************************
  2097. *    使用方表示                        *
  2098. *****************************************************************
  2099. usage:
  2100.     lea.l    usage_mes(pc),a0
  2101.     bsr    mesput
  2102.     bra    exit2
  2103.  
  2104. *****************************************************************
  2105. *    メッセージ表示                        *
  2106. *****************************************************************
  2107. mesput:
  2108. *    move.w    #STDERR,-(sp)        *標準エラー出力へ
  2109.     move.w    #STDOUT,-(sp)        *標準出力へ
  2110.     move.l    a0,-(sp)        *メッセージを
  2111.     DOS    _FPUTS            *出力する
  2112.     addq.l    #6,sp            *スタック補正
  2113.     rts
  2114.  
  2115. *****************************************************************
  2116. *    終了処理                        *
  2117. *****************************************************************
  2118. exit:
  2119.     bsr    cursol_recv        *カーソル戻す
  2120.     IOCS    _MS_INIT        *キーバッファクリア
  2121.     moveq.l    #-1,d1
  2122.     IOCS    _SKEY_MOD
  2123.     move.w    #-1,-(sp)
  2124.     DOS    _KFLUSH
  2125.     addq.l    #2,sp
  2126.     rts
  2127.  
  2128. *****************************************************************
  2129. *    エラー処理2                        *
  2130. *****************************************************************
  2131. exit2:
  2132.     bsr    exit
  2133.     move.w    #1,-(sp)        *終了コード1を持って
  2134.     DOS    _EXIT2            * エラー終了
  2135.  
  2136. *****************************************************************
  2137. *    データエリア                        *
  2138. *****************************************************************
  2139.     .data
  2140.     .even
  2141. usage_mes:
  2142.     .dc.b    '16,256,full color PCX Loader V0.04 by A.MUKAWA',CR,LF
  2143.     .dc.b    '機能:PCXファイルを表示します',CR,LF
  2144.     .dc.b    '用法:LDPCX [スイッチ] ファイル名',CR,LF
  2145.     .dc.b    CR,LF
  2146.     .dc.b    '             /L[x,y]   ロード座標の指定',CR,LF
  2147.     .dc.b    '             /LC       画面中央に表示',CR,LF
  2148.     .dc.b    '             /K        表示後にキー入力待ち',CR,LF
  2149.     .dc.b    '             /Sn       16色PCXの画面モード設定',CR,LF
  2150.     .dc.b    '                         n=0  768x512 31K (DEF)',CR,LF
  2151.     .dc.b    '                         n=1  384x256 31K',CR,LF
  2152.     .dc.b    '                         n=2  640x400 24K',CR,LF
  2153.     .dc.b    '                         n=3  640x480 24K',CR,LF
  2154.     .dc.b    '                         n=4 1024x848 24K',CR,LF
  2155.     .dc.b    '             /Cn       画面クリアモードの設定',CR,LF
  2156.     .dc.b    '                         n=0 画面消去を行わない',CR,LF
  2157.     .dc.b    '                         n=1 テキスト画面のみ消去(DEF)',CR,LF
  2158.     .dc.b    '                         n=2 グラフィック画面のみ消去',CR,LF
  2159.     .dc.b    '                         n=3 テキスト画面とグラフィック画面を消去',CR,LF
  2160.     .dc.b    '             /D        ディザ表示(フルカラーPCXのみ有効)',CR,LF
  2161.     .dc.b    '             /M        MPUに頑張ってもらう',CR,LF
  2162.     .dc.b    CR,LF
  2163.     .dc.b    '             /K指定時、画面からはみ出た部分があるとスクロール出来ます',CR,LF
  2164.     .dc.b    '                       但し16色ファイルは1024x1024dotまでの表示になります',CR,LF
  2165.     .dc.b    '                       また、以下のキー操作を行えます',CR,LF
  2166.     .dc.b    "                       'HOME'       情報表示モードの変更",CR,LF
  2167.     .dc.b    CR,LF
  2168.     .dc.b    '             768x512dot 256色モードは、Oh!X 1995年11月号に掲載された',CR,LF
  2169.     .dc.b    '             菊池功氏の "PageSync()関数"を使用しています。',CR,LF
  2170.     .dc.b    '             256色モードのちらつきはテンキーの"+","-"で調節出来ます。',CR,LF
  2171.     .dc.b    0
  2172. no_file_mes:
  2173.     .dc.b    '表示できるファイルがありません!',CR,LF,0
  2174. name_er_mes:
  2175.     .dc.b    'ファイル名の指定に間違いがあります!',CR,LF,0
  2176. open_er_mes:
  2177.     .dc.b    ' が見つかりません!',CR,LF,0
  2178. read_er_mes:
  2179.     .dc.b    ' の読み込みエラーが発生しました!',CR,LF,0
  2180. no_buff_mes:
  2181.     .dc.b    ' の表示に必要なメモリがありません!',CR,LF,0
  2182. but_col_mes:
  2183.     .dc.b    ' は未サポートの色数です!',CR,LF,0
  2184. but_pos_mes:
  2185.     .dc.b    ' は指定した座標にロード出来ません!',CR,LF,0
  2186. wait_change_mes:
  2187.     .dc.b    'ウェイトを変更しました',CR,LF,0
  2188. crlf_mes:
  2189.     .dc.b    CR,LF,0
  2190. func_off_mes:
  2191.     .dc.b    $1b,$5b,$3e,$31,$68,0
  2192.  
  2193. dext:
  2194.     .dc.b    '.PCX',0        *補う拡張子
  2195. komekome:
  2196.     .dc.b    '\'
  2197. kome0:
  2198.     .dc.b    '*.PCX',0
  2199. wait_name:
  2200.     .dc.b    'bmp256.dat',0
  2201.     .even
  2202.  
  2203. kflg:
  2204.     .dcb.b    1,0            */Kスイッチon/offフラグ(=0...off,<>0...on)
  2205. sflg:
  2206.     .dcb.b    1,0            */Sスイッチon/offフラグ(=0...off,<>0...on)
  2207. cflg:
  2208.     .dcb.b    1,0            */Cスイッチon/offフラグ(=0...off,<>0...on)
  2209. lflg:
  2210.     .dcb.b    1,0            */Lスイッチon/offフラグ(=0...off,<>0...on)
  2211. lcflg:
  2212.     .dcb.b    1,0            */LCスイッチon/offフラグ(=0...off,<>0...on)
  2213. dflg:
  2214.     .dcb.b    1,0            */Dスイッチon/offフラグ(=0...off,<>0...on)
  2215. nflg:
  2216.     .dcb.b    1,0            */Nスイッチon/offフラグ(=0...off,<>0...on)
  2217. mflg:
  2218.     .dcb.b    1,0            */Mスイッチon/offフラグ(=0...off,<>0...on)
  2219. int_flg:
  2220.     .dcb.b    1,0            *
  2221. prt_flg:
  2222.     .dcb.b    1,0            *画像情報の表示/非表示フラグ
  2223.     .even
  2224.  
  2225. s_dot4:
  2226.     .dcb.w    1,8
  2227. s_dot8:
  2228.     .dcb.w    1,4
  2229. s_dot24:
  2230.     .dcb.w    1,8
  2231.  
  2232. crt_max:
  2233.     .dc.w    5-1
  2234. crtc_tbl:
  2235.     .dc.l    mode0
  2236.     .dc.l    mode1
  2237.     .dc.l    mode2
  2238.     .dc.l    mode3
  2239.     .dc.l    mode4
  2240.     .dc.l    mode5
  2241.     .dc.l    mode6
  2242. crtc_data:
  2243. *        HRL  R20  R00  R01  R02  R03  R04  R05  R06  R07  R08
  2244. mode0:    .dc.w    $00,$416, $89, $0E, $1C, $7C,$237, $05, $28,$228, $1B    * 768x512 31kHz
  2245. mode1:    .dc.w    $01,$411, $44, $05, $0A, $3A,$237, $05, $28,$228, $1B    * 384x256 31kHz
  2246. mode2:    .dc.w    $00,$415, $74, $09, $14, $64,$1D0, $07, $20,$1B0, $1B    * 640x400 24kHz
  2247. *mode3:    .dc.w    $00,$415, $72, $08, $14, $64,$1DA, $08, $1E,$1CE, $1B    * 640x432 24kHz
  2248. mode3:    .dc.w    $00,$416, $89, $0F, $21, $71,$204, $02, $20,$200, $16    * 640x480 31kHz
  2249. mode4    .dc.w    $00,$41e, $AC, $0C, $1D, $9D,$1DA, $08, $21,$1C9, $1B    *1024x848 24kHz
  2250. mode5:    .dc.w    $00,$116, $89, $0E, $1C, $7C,$237, $05, $28,$228, $1B    * 768*512 256色モード
  2251. mode6:    .dc.w    $00,$316, $89, $0E, $2C, $6C,$237, $05, $28,$228, $1B    * 512*512 64k色モード
  2252.  
  2253. dot_tbl:
  2254.     .dc.l    dot0
  2255.     .dc.l    dot1
  2256.     .dc.l    dot2
  2257.     .dc.l    dot3
  2258.     .dc.l    dot4
  2259.     .dc.l    dot5
  2260.     .dc.l    dot6
  2261.  
  2262. dot_data:
  2263. dot0:    .dc.w     768,512
  2264. dot1:    .dc.w     384,256
  2265. dot2:    .dc.w     640,400
  2266. dot3:    .dc.w     640,480
  2267. dot4:    .dc.w    1024,848
  2268. dot5:    .dc.w     768,512
  2269. dot6:    .dc.w     512,512
  2270.  
  2271. col4:    .dc.b    '16',0
  2272. col8:    .dc.b    '256',0
  2273. col24:    .dc.b    'full',0
  2274. col??:    .dc.b    '????',0
  2275.  
  2276. inf1:    .dc.b    'ファイル名:',0
  2277. inf2:    .dc.b    '画像サイズ:',0
  2278. inf3:    .dc.b    '色数   :',0
  2279.  
  2280. d_pat:
  2281.     .dc.b     0, 4, 1, 5        *ディザパターン1
  2282.     .dc.b     6, 2, 7, 3
  2283.     .dc.b     1, 5, 0, 4
  2284.     .dc.b     7, 3, 6, 2
  2285.  
  2286. *****************************************************************
  2287. *    ワークエリア                        *
  2288. *****************************************************************
  2289.     .bss
  2290.     .even
  2291. filbuf:
  2292.     .ds.b    53            *ファイル情報格納バッファ
  2293. nambuf:
  2294.     .ds.b    92            *ファイル名展開用バッファ
  2295. arg:
  2296.     .ds.b    256            *ファイル名バッファ
  2297. arg2:
  2298.     .ds.b    256            *'bmp256.dat'用バッファ
  2299. prt_buf:
  2300.     .ds.b    96+3            *画面表示バッファ
  2301. num_buf:
  2302.     .ds.b    10+1            *数値変換バッファ
  2303.     .even
  2304. file_cnt:
  2305.     .ds.w    1            *ファイル数のカウント用バッファ
  2306. sp_save:
  2307.     .ds.l    1
  2308. buff_addr:
  2309.     .ds.l    1            *画像読み込みバッファアドレス
  2310. buff_size:
  2311.     .ds.l    1            *画像読み込みバッファサイズ
  2312. work_addr:
  2313.     .ds.l    1            *ワークアドレス
  2314. gr_addr:
  2315.     .ds.l    1            *変換後画像アドレス
  2316. gr_size:
  2317.     .ds.l    1            *画像サイズ
  2318. fi_size:
  2319.     .ds.l    1            *ファイルサイズ
  2320. yoko:
  2321.     .ds.w    1            *画像の横(X)サイズ
  2322. tate:
  2323.     .ds.w    1            *画像の縦(Y)サイズ
  2324. crt_x:
  2325.     .ds.w    1            *画面のXサイズ
  2326. crt_y:
  2327.     .ds.w    1            *画面のYサイズ
  2328. x_pos:
  2329.     .ds.w    1            *ロード時のX座標
  2330. y_pos:
  2331.     .ds.w    1            *ロード時のY座標
  2332. x_old:
  2333.     .ds.w    1            *前回のX座標
  2334. y_old:
  2335.     .ds.w    1            *前回のY座標
  2336. x_max:
  2337.     .ds.w    1
  2338. y_max:
  2339.     .ds.w    1
  2340. crt_mode:
  2341.     .ds.w    1            *画面モード
  2342. clr_mode:
  2343.     .ds.w    1            *画面クリアモード
  2344. bit4_crtdef:
  2345.     .ds.w    1            *16色BMPの画面モード
  2346. vctr_r0:
  2347.     .ds.w    1            
  2348. vctr_r2:
  2349.     .ds.w    1            
  2350. line_cnt:
  2351.     .ds.w    1
  2352. bpl:
  2353.     .ds.w    1
  2354. bpp:
  2355.     .ds.w    1
  2356. npl:
  2357.     .ds.w    1
  2358. bit_cnt:
  2359.     .ds.w    1
  2360. tenkai_cnt:
  2361.     .ds.w    1
  2362. henkan_cnt:
  2363.     .ds.w    1
  2364. ikisugi:
  2365.     .ds.w    1
  2366. esc_flg:
  2367.     .ds.b    1            *
  2368. next_flg:
  2369.     .ds.b    1            *
  2370. skip_flg:
  2371.     .ds.b    1            *
  2372. inkey_flg1:
  2373.     .ds.b    1            *
  2374. inkey_flg2:
  2375.     .ds.b    1            *
  2376. inkey_flg3:
  2377.     .ds.b    1            *
  2378. scroll_key:
  2379.     .ds.b    1            *スクロール処理のキー
  2380. cur_save:
  2381.     .ds.b    1            *
  2382.     .even
  2383. wait:
  2384.     .ds.w    1            *768x512 256モードのウェイトワーク
  2385. my_stack:
  2386.     .ds.l    1024
  2387. mysp:
  2388.     .end    start
  2389.